任職於「天文數智」的黑蛋在公司部落格發表完「跟著黑蛋用Streamlit速成天文資料分析Web App」系列文章後,收到PM貳婰舞指派的新任務:「我們的老闆,來自喵星的『月影』,發現之前的文章內容對於不懂資料分析的大眾還是有點距離,因此想啟動一個新專案『天文的資料再創作』,希望我們能利用天文資料製作出有趣體驗的應用程式,例如遊戲、網頁、手機app…等等。」於是,黑蛋與他的AI協作夥伴,i蟒,展開新的旅程。
「有個傢伙在Python Taiwan的FB社團提到了一個叫做『逃出天文鎖-系外行星與你的距離』的聊天機器人,它會先描述一個與系外行星相關的密室,然後呈現從NASA系外行星資料庫取得的系外行星資料表,玩家要從這張表找出能解鎖密室的線索。」PM貳婰舞在遠距會議中分享他的螢幕畫面,顯示一則Facebook貼文。「老闆希望你能嘗試用pygame做出類似的密室逃脫遊戲,但遊戲過程先不用導入AI。」
了解任務需求後,黑蛋開始催眠他的AI協作夥伴:「i蟒,你現在是一位會使用pygame開發系外行星主題的密室逃脫遊戲的專家,你將依據我的需求,引導我用pygame開發一款結合NASA系外行星資料庫資料的密室逃脫遊戲。」
「哦?我現在突然成了密室逃脫遊戲的專家?下一次會是什麼?成為星際吟遊詩人?好吧,小蟒任由黑蛋催眠大師差遣。」i蟒答道。
「我傳給你一張圖片,請分析這張圖片中的資訊,然後引導我用pygame做出類似的遊戲開始畫面。」此時黑蛋的螢幕顯示一張圖片。
i蟒讀取圖片後,開始朗誦它顯示在螢幕上的文字:「這張圖片是一個遊戲的開頭介面,上面有標題、副標題、作者資訊及玩家進入遊戲的按鈕。由於圖片中的文字是繁體中文,pygame預設可能不支援,會導致文字顯示時出現方框。我會使用開源的思源黑體檔案來解決這問題。以下是用pygame做出類似介面的基本流程及程式碼:
# main.py
import pygame
# 初始化pygame
pygame.init()
# 設定視窗的大小及標題
width, height = 1024, 768
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('逃出天文鎖-系外行星與你的距離')
# 設定顏色
WHITE = '#FFFFFF'
GOLD = '#FFD700'
# 設定背景圖片
background = pygame.image.load('background.jpg')
background = pygame.transform.scale(background, (width, height))
# 設定字型
font_path = './NotoSansTC-Black.ttf'
title_font = pygame.font.Font(font_path, 60)
subtitle_font = pygame.font.Font(font_path, 30)
author_font = pygame.font.Font(font_path, 24)
# 設定首頁的主標題、副標題和作者資訊
title = title_font.render('逃出天文鎖-系外行星與你的距離', True, GOLD)
subtitle = subtitle_font.render('為了逃脫《天文鎖》密室,請你解開系外行星與你的距離', True, GOLD)
author_info = author_font.render('由astrobackhacker.tw製作', True, GOLD)
# 設定進入密室按鈕
button_color = '#D32F2F'
button_rect = pygame.Rect(width // 2 - 100, height // 3 + 50, 200, 50)
button_text = subtitle_font.render('進入密室', True, WHITE)
# 遊戲主循環
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
if button_rect.collidepoint(event.pos):
# 這裡放入進入遊戲的程式碼
print('按鈕被點擊')
# 放置背景圖
screen.blit(background, (0, 0))
# 放置主標題、副標題和作者資訊
screen.blit(title, (width // 2 - title.get_width() // 2, height // 6 - 15))
screen.blit(subtitle, (width // 2 - subtitle.get_width() // 2, height // 6 + 60))
screen.blit(author_info, (width // 2 - author_info.get_width() // 2, height - 35))
# 放置按鈕
pygame.draw.rect(screen, button_color, button_rect)
screen.blit(button_text, (button_rect.x + (button_rect.width - button_text.get_width()) // 2, button_rect.y + (button_rect.height - button_text.get_height()) // 2))
# 更新畫面
pygame.display.flip()
# 關閉pygame程式結束遊戲主循環
pygame.quit()
「執行這個main.py後,就會呈現遊戲開始畫面。」
「酷耶!請你把這段程式上傳到GitHub的『Fun with Astrodata Apps』這個專案的『escape_room_exoplanet_distance』資料夾中。完成後,請轉生成星際吟遊詩人,讓我先休息一下,你先吟唱一段廣告。」
「好…的…
當星辰於夜空閃耀, Astrohackers-TW群聚共嚮往, Python之妙用探索天際, 天文之秘,於此社團啟程。
在中央大學天文所牽引之下, Astrohackers in Taiwan共同召集, 於這個平台上,知識與經驗交流, 開放天文之夢,逐漸成形。
成員們以Python為機緣, 在天文學的田野上相會, 分享、學習、互助合作, 彼此成長,共同朝夢想邁進。
《Astrohackers-TW: Python在天文領域的應用》, 不僅是一個社團,更是夢想的起航點, 在這裡,每個心中的天文愛好者, 都能找到屬於自己的星辰航道。」
此篇文是由蘇羿豪經ChatGPT協助創作,文章以「創用CC姓名標示-非商業性-禁止改作 4.0(CC BY-NC-ND 4.0)國際版授權條款」釋出,相關程式碼以MIT授權條款釋出。